package daniel.kisti.Helper;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;





/**
 * <pre>
 * daniel.kisti.Helper
 *   |_ Sam_Helper.java
 *
 * </pre>
 *
 * Desc : SAM station 의 시스템 정보와, SAM Disk Cache 정보를 가져온다.
 * @Company : KISTI
 * @Author :daniel
 * @Date   :2011. 10. 31. 오전 11:33:45
 * @Version:V1
 *
 */
public class Sam_Helper {

//	private RequestDataToTierServer requestDatatoTierServer ;	
	private double cpuUse;
	private double memUsage;
	private double memTotal;
	private double memUse;
	
	private double diskIn;
	private double diskOut;
	private double netIn;
	private double netOut;
	
	private double cdf01DiskSize;
	private double cdf01DiskUsed;
	private String cdf01DiskUsage;
	
	private double cdf02DiskSize;
	private double cdf02DiskUsed;
	private String cdf02DiskUsage;
	
	private double cdfUserDiskSize;
	private double cdfUserDiskUsed;
	private String cdfUserDiskUsage;
	
	private String status;	
	
	public Sam_Helper() {
		// TODO Auto-generated constructor stub
		
//		 requestDatatoTierServer = new RequestDataToTierServer();
	}
	
	
	
	
	/**
	 * 
	 * Desc : XML 데이터 파싱 / 해당 속성값 반환
	 * @Method Name : getChildren
	 * @param element
	 * @param tagName
	 * @return tag에 의한 속성값 찾아서 반환
	 *
	 */
	private static String getChildren(Element element, String tagName) {
		NodeList list = element.getElementsByTagName(tagName);
		Element cElement = (Element) list.item(0);

		if (cElement.getFirstChild() != null) {
			return cElement.getFirstChild().getNodeValue();
		} else {
			return "";
		}
	}
	
	

	
	
	
	
	/**
	 * 
	 * Desc : Sam Station의 SamSystem 정보를 TierServer로부터 로드한다.
	 * 멤버변수cpuUse, memTotal, memUse, memUsage, diskIn, diskOut, netIn, netOut 에 
	 * 해당 정보를 저장한다. 
	 * @Method Name : loadSamInfoData
	 *
	 */
	public void loadSamInfoData(){
//		String result = (String)requestDatatoTierServer.request("samInfo");		
		String result ="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><Data><Node><memTotal>4049344</memTotal><memUse>92284</memUse><cpuUse>0</cpuUse><diskRead>0</diskRead><diskWrite>0</diskWrite><netIn>2191</netIn><netOut>6606</netOut></Node></Data>";
		//파싱
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			InputStream istream = new ByteArrayInputStream(result.getBytes("utf-8"));
			Document doc = builder.parse(istream);
			
//			Log.d("[Sam_Helper]","[loadSamInfoData] : "+ result);
			
			Element order = doc.getDocumentElement();
			NodeList items = order.getElementsByTagName("Node");
			Element element = (Element) items.item(0);
			
			cpuUse = Double.parseDouble(getChildren(element, "cpuUse"));
			
			memTotal = Double.parseDouble( getChildren(element, "memTotal") );
			memUse = Double.parseDouble( getChildren(element, "memUse") );
			memUsage = (memUse/memTotal)*100;
			
			
			diskIn = Double.parseDouble( getChildren(element, "diskRead") );
			diskOut = Double.parseDouble( getChildren(element, "diskWrite") );
			netIn = Double.parseDouble( getChildren(element, "netIn") );
			netOut = Double.parseDouble( getChildren(element, "netOut") );
			
			
			}catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}		
	}	
	/**
	 * 
	 * Desc : Sam Station 서버의 Cpu 사용율을 가져온다. loadSamInfoData()함수 호출을 먼저 해야 한다.
	 * @Method Name : getCpuUse
	 * @return Sam Station 서버의 Cpu 사용율 반환
	 *
	 */
	public double getCpuUse() {
		return cpuUse;
	}
	/**
	 * 
	 * Desc : Sam Station 서버의 메모리 사용율을 가져온다. loadSamInfoData()함수 호출을 먼저 해야 한다.
	 * @Method Name : getMemUsage
	 * @return Sam Station 서버의 메모리 사용율 반환
	 *
	 */
	public double getMemUsage() {
		return memUsage;
	}
	/**
	 * 
	 * Desc :Sam Station 서버의 메모리 Total 크기를  가져온다. loadSamInfoData()함수 호출을 먼저 해야 한다.
	 * @Method Name : getMemTotal
	 * @return Sam Station 서버의 메모리 Total 크기를 반환
	 *
	 */
	public double getMemTotal() {
		return memTotal;
	}
	/**
	 * 
	 * Desc :Sam Station 서버의 메모리 사용량을  가져온다. loadSamInfoData()함수 호출을 먼저 해야 한다.
	 * @Method Name : getMemUse
	 * @return Sam Station 서버의 메모리 사용량을  반환
	 *
	 */
	public double getMemUse() {
		return memUse;
	}
	/**
	 * 
	 * Desc :Sam Station 서버의 디스크 쓰기량을  가져온다. loadSamInfoData()함수 호출을 먼저 해야 한다.
	 * @Method Name : getDiskIn
	 * @return Sam Station 서버의 디스크 쓰기량을  반환
	 *
	 */
	public double getDiskIn() {
		return diskIn;
	}
	/**
	 * 
	 * Desc :Sam Station 서버의 디스크 읽기량을  가져온다. loadSamInfoData()함수 호출을 먼저 해야 한다.
	 * @Method Name : getDiskOut
	 * @return Sam Station 서버의 디스크 읽기량을  반환
	 *
	 */
	public double getDiskOut() {
		return diskOut;
	}
	/**
	 * 
	 * Desc :Sam Station 서버의 네트워크 in bound band with 크기를  가져온다. loadSamInfoData()함수 호출을 먼저 해야 한다.
	 * @Method Name : getNetIn
	 * @return Sam Station 서버의 네트워크 in bound band with 크기를  반환
	 *
	 */
	public double getNetIn() {
		return netIn;
	}
	/**
	 * 
	 * Desc :Sam Station 서버의 네트워크 out bound band with 크기를  가져온다. loadSamInfoData()함수 호출을 먼저 해야 한다.
	 * @Method Name : getNetOut
	 * @return Sam Station 서버의 네트워크 out bound band with 크기를  반환
	 *
	 */
	public double getNetOut() {
		return netOut;
	}

	
	
	
	
	
	/**
	 * 
	 * Desc : Sam Station 서버의 SamDisk Cache 정보를 TierServer로부터 로드한다.
	 * 멤버변수 cdf01DiskSize, cdf01DiskUsed, cdf01DiskUsage,
	 * cdf02DiskSize, cdf02DiskUsed, cdf02DiskUsage,
	 * cdfUserDiskSize, cdfUserDiskUsed, cdfUseDiskUsage 에 해당 정보를 저장한다.   
	 * @Method Name : loadSamDiskData
	 *
	 */
	public void loadSamDiskData(){
//		Log.d("[Sam_Helper]","[loadSamDiskData]........>>> : ");
//		String result = (String)requestDatatoTierServer.request("samDisk");		
		String result ="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><Data><Node><cdf01Size>105074219000</cdf01Size><cdf01Used>97566654072</cdf01Used><cdf01Usage>94%</cdf01Usage><cdf02Size>88262343960</cdf02Size><cdf02Used>699568444</cdf02Used><cdf02Usage>1%</cdf02Usage><generalDiskSize>209715200</generalDiskSize><generalDiskUsed>75002176</generalDiskUsed><generalDiskUsage>36%</generalDiskUsage></Node></Data>";
		//파싱
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			InputStream istream = new ByteArrayInputStream(result.getBytes("utf-8"));
			Document doc = builder.parse(istream);			
//			Log.d("[Sam_Helper]","[loadSamDiskData] : "+ result);
			
			Element order = doc.getDocumentElement();
			NodeList items = order.getElementsByTagName("Node");
			Element element = (Element) items.item(0);
			
			cdf01DiskSize = Double.parseDouble( getChildren(element, "cdf01Size") );
			cdf01DiskUsed = Double.parseDouble( getChildren(element, "cdf01Used") );
			cdf01DiskUsage = getChildren(element, "cdf01Usage") ;
			cdf02DiskSize = Double.parseDouble( getChildren(element, "cdf02Size") );
			cdf02DiskUsed = Double.parseDouble( getChildren(element, "cdf02Used") );
			cdf02DiskUsage = getChildren(element, "cdf02Usage") ;			
			cdfUserDiskSize = Double.parseDouble( getChildren(element, "generalDiskSize") );
			cdfUserDiskUsed = Double.parseDouble( getChildren(element, "generalDiskUsed") );
			cdfUserDiskUsage = getChildren(element, "generalDiskUsage") ;
			
			
			}catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}		
	}
	/**
	 * 
	 * Desc :  Sam Station 서버의 CDF01 disk Cache 크기를 가져온다.. loadSamDiskData() 함수를 먼저 호출 하여야 한다.
	 * @Method Name : getCdf01DiskSize
	 * @return Sam Station 서버의 CDF01 disk Cache 크기 반환
	 *
	 */
	public double getCdf01DiskSize() {		
		return cdf01DiskSize;
	}
	/**
	 * 
	 * Desc : Sam Station 서버의 CDF01 disk Cache 상용량을 가져온다.. loadSamDiskData() 함수를 먼저 호출 하여야 한다.
	 * @Method Name : getCdf01DiskUsed
	 * @return Sam Station 서버의 CDF01 disk Cache 상용량 반환
	 *
	 */
	public double getCdf01DiskUsed() {		
		return cdf01DiskUsed;
	}
	/**
	 * 
	 * Desc : Sam Station 서버의 CDF01 disk Cache 상용률을 가져온다.. loadSamDiskData() 함수를 먼저 호출 하여야 한다.
	 * @Method Name : getCdf01DiskUsage
	 * @return Sam Station 서버의 CDF01 disk Cache 상용률 반환
	 *
	 */
	public String getCdf01DiskUsage() {
		return cdf01DiskUsage;
	}
	/**
	 * 
	 * Desc : Sam Station 서버의 CDF02 disk Cache 크기를 가져온다.. loadSamDiskData() 함수를 먼저 호출 하여야 한다.
	 * @Method Name : getCdf02DiskSize
	 * @return Sam Station 서버의 CDF02 disk Cache 크기 반환
	 *
	 */
	public double getCdf02DiskSize() {
		return cdf02DiskSize;
	}
	/**
	 * 
	 * Desc :  Sam Station 서버의 CDF02 disk Cache 상용량을 가져온다.. loadSamDiskData() 함수를 먼저 호출 하여야 한다.
	 * @Method Name : getCdf02DiskUsed
	 * @return Sam Station 서버의 CDF02 disk Cache 상용량 반환
	 *
	 */
	public double getCdf02DiskUsed() {
		return cdf02DiskUsed;
	}
	/**
	 * 
	 * Desc : Sam Station 서버의 CDF02 disk Cache 상용률을 가져온다.. loadSamDiskData() 함수를 먼저 호출 하여야 한다.
	 * @Method Name : getCdf02DiskUsage
	 * @return Sam Station 서버의 CDF02 disk Cache 상용률 반환
	 *
	 */
	public String getCdf02DiskUsage() {
		return cdf02DiskUsage;
	}
	/**
	 * 
	 * Desc : Sam Station 서버의 사용자 디스크  크기를 가져온다.. loadSamDiskData() 함수를 먼저 호출 하여야 한다.
	 * @Method Name : getCdfUserDiskSize
	 * @return Sam Station 서버의 사용자 디스크  크기 반환
	 *
	 */
	public double getCdfUserDiskSize() {
		return cdfUserDiskSize;
	}
	/**
	 * 
	 * Desc :Sam Station 서버의 사용자 디스크  사용량을  가져온다.. loadSamDiskData() 함수를 먼저 호출 하여야 한다.
	 * @Method Name : getCdfUserDiskUsed
	 * @return Sam Station 서버의 사용자 디스크  상용량 반환
	 *
	 */
	public double getCdfUserDiskUsed() {
		return cdfUserDiskUsed;
	}
	/**
	 * 
	 * Desc :Sam Station 서버의 사용자 디스크 상용률을 가져온다.. loadSamDiskData() 함수를 먼저 호출 하여야 한다.
	 * @Method Name : getCdfUserDiskUsage
	 * @return Sam Station 서버의 사용자 디스크  상용률 반환
	 *
	 */
	public String getCdfUserDiskUsage() {
		return cdfUserDiskUsage;
	}	
	
	/**
	 * Desc : Sam Station의 Dstat 명령어 정보를 TierServer로부터 로드한다.
	 * @Method Name : loadDstatData
	 * @return [cpuUsage, diskRead, diskWrite, netRecv, netSend] 값을 배열에 차례로 담아 리턴
	 * <br> cpuUsage는 100분률, 나머지는  byte단위.
	 * 
	 */
	public String[] loadDstatData(){
//		String result = (String)requestDatatoTierServer.request("getDstat");
	
		String result = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><Data><Node><cpuUsage>0</cpuUsage><diskRead>121</diskRead><diskWrite>127</diskWrite><netRecv>1484</netRecv><netSend>1208</netSend></Node></Data>";
		String[] dstat = new String[5];
		//파싱
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			InputStream istream = new ByteArrayInputStream(result.getBytes("utf-8"));
			Document doc = builder.parse(istream);
			
			
			Element order = doc.getDocumentElement();
			NodeList items = order.getElementsByTagName("Node");			
			

//			for (int i = 0; i < items.getLength(); i++) {
				Element element = (Element) items.item(0);

	
				dstat[0] = getChildren(element, "cpuUsage");
				dstat[1] = getChildren(element, "diskRead");
				dstat[2] = getChildren(element, "diskWrite");
				dstat[3] = getChildren(element, "netRecv");
				dstat[4] = getChildren(element, "netSend");
//			}		
			}catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}		
			return dstat;
	}
	/**
	 * 
	 * Desc : Sam Station의 Dstat 명령어 정보 가져온다
	 * @Method Name : getStatus
	 * @return Sam Station의 Dstat 명령어 정보 반환
	 *
	 */
	public String getStatus(){
		return status;
	}


	
	
	
	
	
	
	
	
	
	
	


	/**
	 * Desc :
	 * @Method Name : main
	 * @param args
	 * 
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}
